
// import uvm_pkg::*;

// `include "uvm_macros.svh"



// //   class eht_mac_tx_transaction extends uvm_sequence_item;
// //         rand    bit [7:0]   axis_tx_data;
// //         rand    bit         axis_tx_valid;
// //         rand    bit         axis_tx_ready;
// //         rand    bit         axis_tx_last;
// //         rand    bit [31:0]  axis_tx_user;

// //     //向工厂注册此类
// //     `uvm_object_utils(eht_mac_tx_transaction)



// //     endclass

// class eht_mac_top_driver extends uvm_driver;
//     //virtual eht_mac_tx_intf intf;
//     `uvm_component_utils(eht_mac_top_driver)

//     virtual axis_master_if vif;

//     function new(string name = "eht_mac_top_driver", uvm_component parent = null);
//         super.new(name, parent);
//         `uvm_info("eht_mac_top_driver","new is called",UVM_LOW)
//     endfunction

//     function void build_phase(uvm_phase phase);
//         super.build_phase(phase);
//         `uvm_info("eht_mac_top_driver","build_phase is called",UVM_LOW)
//         if(!uvm_config_db# (virtual axis_master_if )::get(this, "", "vif",vif))
//             `uvm_fatal("eht_mac_top_driver", "virtual axis_master_if must be set for vif!!!")
        
//     endfunction


//     task main_phase(uvm_phase phase);
//         //object maismch,if there is not raise,the task finish immdately
//         phase.raise_objection(this);
//         `uvm_info("eht_mac_top_driver","main_phase is called",UVM_LOW)
//         vif.axis_tx_data <= 0;
//         vif.axis_tx_valid <= 0;
//         vif.axis_tx_last <= 0;
//         vif.axis_tx_user <= 0;
//         while(vif.rst)
//         @(posedge vif.clk);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(1500);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(1500);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         mac_tx_pakage(46);
//         //when there is raise ,the simlation finshed when drop
//         phase.drop_objection(this);
//     endtask

//     task mac_tx_pakage(logic [15:0] len);
//         logic [15:0] i = 0;
//         @(posedge vif.clk);
//         vif.axis_tx_user <= {16'h0800,len};
//         vif.axis_tx_valid <= 1;
//         vif.axis_tx_data <= i[7:0];
//         repeat(len) begin
//             @(negedge vif.clk);
//             wait(vif.axis_tx_ready==1)
//             i = i+1;
//             @(posedge vif.clk);
//             vif.axis_tx_data <= i[7:0];   
//             if(i == len-1)
//             vif.axis_tx_last <= 1;        
//         end
//         vif.axis_tx_valid <= 0;
//         vif.axis_tx_data <= 0;
//         vif.axis_tx_last <= 0;
    
//     endtask

// endclass




// module tb_ethernet_mac_top;

//     logic   clk             ;
//     logic   rst             ;
//     logic   [7:0]axis_rx_data    ; 
//     logic   [31:0]axis_rx_user    ; 
//     logic   axis_rx_last    ; 
//     logic   axis_rx_valid   ; 
//     logic   axis_rx_ready   ; 
//     logic   [7:0]gmii_txdata     ; 
//     logic   gmii_txvalid    ;  
//      logic   [7:0]gmii_rxdata     ; 
//     logic   gmii_rxvalid    ;  

//     logic   [47:0]set_target_mac;
//     logic   set_target_mac_valid;

//     logic   rx_is_broadcast;
//     logic   tx_is_broadcast;

//     axis_master_if axis_tx_if(clk,rst);

//     assign tx_is_broadcast = 0;


//     assign gmii_rxvalid = gmii_txvalid;
//     assign gmii_rxdata = gmii_txdata;

//     ethernet_mac_top #(
//       .TARGET_MAC                ( 48'hff_ff_ff_ff_ff_ff    ),
//       .SOURCE_MAC                ( 48'h01_02_03_04_05_06    ),
//       .CRC_ON                    ( 1                        )      
//     )dut(
//       .i_clk                     ( clk                      ),
//       .i_rst                     ( rst                      ),
//       .i_set_target_mac          ( set_target_mac           ),
//       .i_set_target_mac_valid    ( set_target_mac_valid     ),
//       .i_set_source_mac          ( 0),
//       .i_set_source_mac_valid    ( 0),
//       .o_rx_is_broadcast         ( rx_is_broadcast          ),
//       .o_axis_rx_data            ( axis_rx_data             ),
//       .o_axis_rx_user            ( axis_rx_user             ),
//       .o_axis_rx_last            ( axis_rx_last             ),
//       .o_axis_rx_valid           ( axis_rx_valid            ),
//       .i_axis_tx_data            ( axis_tx_if.m_axis_tdata  ),
//       .i_axis_tx_user            ( axis_tx_if.m_axis_tuser  ),
//       .i_axis_tx_last            ( axis_tx_if.m_axis_tlast  ),
//       .i_axis_tx_valid           ( axis_tx_if.m_axis_tvalid ),
//       .o_axis_tx_ready           ( axis_tx_if.m_axis_tready ),
//       .i_gmii_rxdata             ( gmii_rxdata              ),
//       .i_gmii_rxvalid            ( gmii_rxvalid             ),
//       .o_gmii_txdata             ( gmii_txdata              ),
//       .o_gmii_txvalid            ( gmii_txvalid             )
//    );  
  
//     initial begin
//         clk <= 0;
//         forever begin
//             #4ns;
//             clk <= ~clk;
//         end
//     end

//     initial begin
//         rst <= 1;
//         #100ns;
//         @(posedge clk)
//         #1ns;
//         rst <= 0;
//     end

//     initial begin
//         #10us;
//         @(posedge clk);
//         set_target_mac_valid <= 1;
//         set_target_mac <= 48'h01_02_03_04_05_06;
//         @(posedge clk)
//         set_target_mac_valid <= 0;
//     end

//     initial begin
//         uvm_config_db# (virtual axis_master_if )::set(null, "uvm_test_top","vif",axis_tx_if);
//         run_test("eht_mac_top_driver");
//     end

// endmodule